﻿#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;

class PersonPO
{
public:
	PersonPO(int age)
	{
		this->m_Age = age;
	}
	void showAge()
	{
		cout << "年龄为：" << this->m_Age << endl;
	}
	~PersonPO()
	{
		cout << "PersonPO的析构调用！" << endl;
	}

	int m_Age;
};
//2.智能指针，用来托管自定义类型的对象，让对象进行自动释放；
class SmartPointer
{
public:
	SmartPointer(PersonPO* person)
	{
		this->person = person;
	}
	//5.重载->，让智能指针对象sp，像PersonOP* person一样去使用；
	PersonPO* operator->()
	{
		return this->person;
	}
	//7.重载*；
	PersonPO& operator*()
	{
		return *this->person;
	}

	~SmartPointer()
	{
		cout << "智能指针调用析构！" << endl;
		if (this->person != NULL)
		{
			delete this->person;
			this->person = NULL;
		}
	}
private:
	PersonPO* person;
};
void testPointerOverload()
{
	//1.开辟在栈上，自动析构；
	//PersonPO p1(10);

	//4.开辟在堆上；
	//PersonPO* p2 = new PersonPO(20);
	//p2->showAge();
	//delete p2;//PersonPO的析构调用！

	//3.开辟在栈上，自动释放，自动析构；
	SmartPointer sp(new PersonPO(30));
	//6.showAge()返回PersonOP*对象，即使调用，也该是sp->->showAge()，这里是编译器做了优化，简化写法；
	sp->showAge();//年龄为：30
	(*sp).showAge();//年龄为：30

	//智能指针调用析构！
	//PersonPO的析构调用！
}

//main280：指针运算符重载
int main280()
{
	testPointerOverload();

	system("pause");
	return EXIT_SUCCESS;
}